#ifndef __PID_H__
#define __PID_H__

#include "ti_msp_dl_config.h"
#include "PWM.h"
#include "encoder.h"

typedef struct
{
    float SetValue;     // 用户期望值，也就是我们期望系统调节到输出此值然后稳定在这一状态
    float pid_Calc_out; // PID计算输出结果值，用来驱动执行机构
    float error;        // 当前偏差值
    float error_last;   // 上一次计算的偏差值
    float error_pre;    // 上上一次计算的偏差值，在增量式里用到
    float Kp;           // 比例系数
    float Ki;           // 积分系数
    float Kd;           // 微分系数
    float integral;     // 积分值
    float integral_max; // 积分最大值
} PID;                  // 结构体，方便管理

extern PID GW_gray_PID; // 定义一个PID结构体变量GW_gray_PID,用于灰度传感器PID控制
extern PID Yaw_PID; // 定义一个PID结构体变量Yaw_PID,用于舵机PID控制

extern PID PID_encoder_ASPD;
extern PID PID_encoder_BSPD;


float PID_Calc(PID *pPID_Calc, float Next_val, float actual, uint8_t is_cal_yaw);
float PID_Incremental_Calc(PID *pPID_Calc, float Next_val, float actual, uint8_t is_cal_yaw);
// 常用宏定义
#define MAX_PWM_VALUE       999     // PWM最大值
#define MIN_PWM_VALUE       -999    // PWM最小值
#define SPEED_CONTROL_PERIOD 10     // 控制周期(ms)

// 默认PID参数
#define DEFAULT_KP          0.8f    // 默认比例系数
#define DEFAULT_KI          0.1f    // 默认积分系数
#define DEFAULT_KD          0.05f   // 默认微分系数
#define DEFAULT_I_LIMIT     500.0f  // 默认积分限幅

#endif
